<?php

/**
 * Перевод интерфейса приложения
 *
 */
abstract class Kernel_i18n {

    /**
     * Наименование текущего языка
     *
     * @var string
     */
    static private $_lang;

    /**
     * Реализация локали для текущего языка
     *
     * @var Kernel_i18n_Abstract
     */
    static private $_locale;

    /**
     * Значения фраз
     *
     * @var array
     */
    static private $_values = array();

    /**
     * Массив импортированных пэкиджей, чтобы не загружать по два раза.
     *
     * @var array
     */
    static private $_imported = array();

    /**
     * Устанавливает язык интерфейса, если указан, и возвращает предыдущее значение.
     *
     * @param   string  $lang
     * @return  string
     */
    static public function lang($lang = null) {
        $_lang = self::$_lang;
        if (func_num_args() > 0) {
            self::$_lang = $lang;
            self::$_locale = Kernel::factory('Kernel_i18n', $lang);
        }
        return $_lang;
    }

    /**
     * Возвращает перевод указанной фразы.
     *
     * @param   string  $phrase
     * @return  string
     */
    static public function get($phrase) 
    {
        // это аргументы, переданные в метод кроме первого
        $args = array_slice(func_get_args(), 1);
        return null !== ($value = @self::$_values[$phrase])
            // если переданы аргументы для подстановки в шаблон
            ? (count($args) > 0
                // форматируем по шаблону
                ? (!is_array($value)
                    ? vsprintf($value, $args)
                    : self::$_locale->plural($value, reset($args)))
                // просто берем значение фразы
                : $value)
            // пытаемся представить фразу в человеческом виде
            : utf8_ucfirst(utf8_lowercase(str_replace('_', ' ', $phrase)));
    }

    /**
     * Определяет, существует ли перевод указанной фразы. Может быть использован
     * при замене стандартных фраз компонентов customized-ными… бля :)
     *
     * @param   string  $phrase
     * @return  boolean
     */
    static public function exists($phrase) 
    {
        return isset(self::$_values[$phrase]);
    }

    /**
     * Загружает переводы фраз указанных пэкиджей.
     *
     * @param   string  $package1 [, string …]
     */
    static public function import() 
    {
        foreach (func_get_args() as $package) {
            if (!in_array($package, self::$_imported)) {
                foreach (array(KERNEL_REPOSITORY, PROJECT_REPOSITORY) as $dir) {
                    $path = $dir  . DIRECTORY_SEPARATOR . $package . DIRECTORY_SEPARATOR . 'Lang';
                    try {
                        self::_import(Zend_Loader::loadFile(self::$_lang . '.php', $path));
                    } catch (Zend_Exception $e) {
                        // ничего страшного :)
                    }
                }
            }
            self::$_imported[] = $package;
        }
    }

    /**
     * Импортирует массив фраз.
     *
     * @param   array   $phrases
     */
    static private function _import($phrases) 
    {
        self::$_values = array_merge(self::$_values, $phrases);
    }
}

Kernel_i18n::lang(defined('LANGUAGE') ? constant('LANGUAGE') : 'en');

/**
 * Ярлык для Kernel_i18n::get(). Возвращает перевод указанной фразы.
 *
 * @param   string  $phrase [, mixed $param1, …]
 * @return  string
 */
function __() 
{
    $args = func_get_args();
    return call_user_func_array(array('Kernel_i18n', 'get'), $args);
}
